import java.util.LinkedList;

/**
 * 
 * @author Marmol,Varela,Pautasso,Castellina
 *
 */
public class Calculadora {
	private Polinomio polinomio1;
	
		
	/**
	 * Suma dos polinomios.
	 * @param polinomio1 Termino a sumar.
	 * @param polinomio2 Termino a sumar.
	 * @return polinomioResultado resultado.
	 */
	public static Polinomio suma(Polinomio polinomio2, Polinomio polinomio1){
		Polinomio polinomioResultado = new Polinomio();
		polinomio1.ordenarDec();
		polinomio1.completar();
		polinomio2.ordenarDec();
		polinomio2.completar();
		LinkedList<Termino> ecuacion1 = polinomio1.getEcuacion();
		LinkedList<Termino> ecuacion2 = polinomio2.getEcuacion();
		int m = 0;
		int n = 0;
		while(ecuacion2.size()>m){
			System.out.println(ecuacion1.get(n).getExponente());
			if (ecuacion1.get(n).getExponente()==ecuacion2.get(m).getExponente()){
				polinomioResultado.addTermPolinomio((ecuacion1.get(n).getValor()+ ecuacion2.get(m).getValor()), ecuacion1.get(n).getExponente());
				m = m + 1;
				n = n + 1;
			}
			else{
				if (ecuacion1.get(n).getExponente()>ecuacion2.get(m).getExponente()){
					//if (!(ecuacion1.get(n).getValor()==1 && ecuacion2.get(m).getValor()==-1) ||!(polinomio1.getTermino().getValor()==-1 && polinomio1.getTermino().getValor()==1)){
					polinomioResultado.addTermPolinomio(ecuacion1.get(n).getValor(), ecuacion1.get(n).getExponente());
					//}
					n++;
					}
				else{
					polinomioResultado.addTermPolinomio(ecuacion2.get(m).getValor(), ecuacion2.get(m).getExponente());
					m++;
				}
			}
		}
		return polinomioResultado;
	}
	
	/**
	 * Resta dos polinomios.
	 * @param polinomio2 
	 * @return p resultado.
	 */
	public static Polinomio Resta(Polinomio polinomio2, Polinomio polinomio1){
		Polinomio polinomioResultado = new Polinomio();
		polinomio1.ordenarDec();
		polinomio1.completar();
		polinomio2.ordenarDec();
		polinomio2.completar();
		LinkedList<Termino> ecuacion1 = polinomio1.getEcuacion();
		LinkedList<Termino> ecuacion2 = polinomio2.getEcuacion();
		int m = 0;
		int n = 0;
		while(ecuacion2.size()>m){
			System.out.println(ecuacion1.get(n).getExponente());
			if (ecuacion1.get(n).getExponente()==ecuacion2.get(m).getExponente()){
				polinomioResultado.addTermPolinomio((ecuacion1.get(n).getValor()- ecuacion2.get(m).getValor()), ecuacion1.get(n).getExponente());
				m = m + 1;
				n = n + 1;
			}
			else{
				if (ecuacion1.get(n).getExponente()>ecuacion2.get(m).getExponente()){
					polinomioResultado.addTermPolinomio(ecuacion1.get(n).getValor(), ecuacion1.get(n).getExponente());
					n++;
				}
				else{
					polinomioResultado.addTermPolinomio(ecuacion2.get(m).getValor(), ecuacion2.get(m).getExponente());
					m++;
				}
			}
		}
		return polinomioResultado;
	}
	
	/**
	 * Retorna el producto dos polinomios.
	 * @param p primer polinomio.
	 * @param q segundo polinomio.
	 * @return p resultado.
	 */
	public static Polinomio Producto(Polinomio polinomio1,Polinomio polinomio2){
		Polinomio polinomioResultado = new Polinomio();
		polinomio1.ordenarDec();
		polinomio2.ordenarDec();
		LinkedList<Termino> ecuacion1 = polinomio1.getEcuacion();
		LinkedList<Termino> ecuacion2 = polinomio2.getEcuacion();
		int m = 0;
		int n = 0;
		while(ecuacion1.size()>n ){
			m = 0;
			while (ecuacion2.size()>m){
				System.out.println(m);
				polinomioResultado.addTermPolinomio((ecuacion1.get(n).getValor()*ecuacion2.get(m).getValor()), ecuacion1.get(n).getExponente()+ ecuacion1.get(m).getExponente());
				m++;
			}
			n++;
		}
		polinomioResultado.ordenarDec();
		return polinomioResultado;
	}
	
	/**
	 * Retorna el cociente de dos polinomios.
	 * @param divisor polinomio divisor.
	 * @return polinomioResultado resultaldo.
	 */
	public static Polinomio Cociente(Polinomio dividendo,Polinomio divisor){
		Polinomio polinomioResultado = new Polinomio();
		Polinomio polinomioAuxiliar = new Polinomio();
		
		dividendo.ordenarDec();
		dividendo.completar();
		divisor.ordenarDec();
		divisor.completar();
		LinkedList<Termino> ecuacion1 = dividendo.getEcuacion();
		LinkedList<Termino> ecuacion2 = divisor.getEcuacion();
		
		int m = 0;
		int n = 0;
		while(ecuacion1.size()>n){
			polinomioResultado.addTermPolinomio(ecuacion1.get(n).getValor()-ecuacion2.get(m).getValor(),ecuacion1.get(n).getExponente()-ecuacion2.get(n).getExponente());
			polinomioAuxiliar = Producto(polinomioResultado,divisor);
			dividendo = Resta(dividendo,polinomioAuxiliar);
			ecuacion1 = dividendo.getEcuacion();
		}
		return polinomioResultado;
	}
	
	/**
	 * Retorna el cociente Ruffini de dos polinomios.
	 * @param divisor divisor del polinomio
	 * @return polinomioResultado resutaldo.
	 */
	public Polinomio cocienteRuffini(Polinomio divisor){
		Polinomio polinomioResultado = new Polinomio();
		polinomio1.completar();
		polinomioResultado.addTermPolinomio(polinomio1.getTermino().getValor(), polinomio1.getTermino().getExponente());
		divisor.eliminarTermino();
		polinomio1.eliminarTermino();
		int divisorRuffini = (divisor.getTermino().getValor()* (-1)); 
		while (polinomio1.noVacio()){
			polinomioResultado.addTermPolinomio(polinomio1.getTermino().getValor()+ (divisorRuffini * polinomioResultado.getTermino().getValor()), polinomio1.getLastTermino().getExponente());
			polinomio1.eliminarTermino();
		}
		return polinomioResultado;
	}
	
	/**
	 * Retorna verdadero si es posible aplicar Ruffini.
	 * @param p primer polinomio.
	 * @return p resutaldo.
	 */
	public boolean esPosibleRuffini(Polinomio divisor){
		if (divisor.getTermino().getExponente()> 1){
			return false;
		}
		return true;
	}


	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Polinomio pol = new Polinomio();
		Polinomio pol2 = new Polinomio();
		try {
			pol2.makePolinomioFromFile();
			pol.makePolinomioFromFile();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//pol.ordenarDec();
		System.out.println(pol.verPolinomio());
		pol = Cociente(pol,pol2);
		System.out.println(pol.verPolinomio());
		
		//pol.completar();

	}

}
